package com.ruoyi.common.utils;

import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

@Slf4j
public class SimilarFilesFinderUtil {
    /**
     * 获取目录中与目标文件名前缀相似的文件
     * @param dirPath 目录路径
     * @param prefix 前缀（如 "report_"）
     * @return 前缀匹配的文件列表
     */
    public static List<File> findByPrefix(String dirPath, String prefix) {
        return findSimilarFiles(dirPath, (fileName) -> fileName.startsWith(prefix));
    }

    /**
     * 获取目录中与目标文件名前缀相似的文件
     * @param dirPath 目录路径
     * @param prefix 前缀（如 "report_"）
     * @return 前缀匹配的文件路径列表
     */
    public static ArrayList<String> findPathByPrefix(String dirPath, String prefix) {
        return findSimilarFilesPath(dirPath, (fileName) -> fileName.startsWith(prefix));
    }

    /**
     * 获取目录中与目标文件名后缀相似的文件
     * @param dirPath 目录路径
     * @param suffix 后缀（如 ".txt"）
     * @return 后缀匹配的文件列表
     */
    public static List<File> findBySuffix(String dirPath, String suffix) {
        return findSimilarFiles(dirPath, (fileName) -> fileName.endsWith(suffix));
    }

    /**
     * 获取目录中与目标文件名后缀相似的文件
     * @param dirPath 目录路径
     * @param suffix 后缀（如 ".txt"）
     * @return 后缀匹配的文件列表lj
     */
    public static ArrayList<String> findPathBySuffix(String dirPath, String suffix) {
        return findSimilarFilesPath(dirPath, (fileName) -> fileName.endsWith(suffix));
    }

    /**
     * 获取目录中文件名包含关键字的文件
     * @param dirPath 目录路径
     * @param keyword 关键字（如 "2023"）
     * @return 包含关键字的文件列表
     */
    public static List<File> findByKeyword(String dirPath, String keyword) {
        return findSimilarFiles(dirPath, (fileName) -> fileName.contains(keyword));
    }

    /**
     * 通过正则表达式匹配相似文件名
     * @param dirPath 目录路径
     * @param regex 正则表达式（如 "image_\d+\.png" 匹配 image_1.png、image_2.png 等）
     * @return 正则匹配的文件列表
     */
    public static List<File> findByRegex(String dirPath, String regex) {
        Pattern pattern = Pattern.compile(regex);
        return findSimilarFiles(dirPath, (fileName) -> pattern.matcher(fileName).matches());
    }

    /**
     * 通用方法：根据自定义规则筛选文件
     * @param dirPath 目录路径
     * @param matcher 匹配规则接口
     * @return 符合规则的文件列表
     */
    private static List<File> findSimilarFiles(String dirPath, FileNameMatcher matcher) {
        List<File> result = new ArrayList<>();
        File dir = new File(dirPath);

        // 检查目录是否存在且是目录
        if (!dir.exists() || !dir.isDirectory()) {
            System.err.println("目录不存在或不是目录：" + dirPath);
            return result;
        }

        // 遍历目录下的所有文件（不包含子目录，如需递归可修改）
        File[] files = dir.listFiles();
        if (files == null) {
            return result; // 目录不可访问
        }

        for (File file : files) {
            if (file.isFile()) { // 只处理文件（排除目录）
                String fileName = file.getName();
                if (matcher.matches(fileName)) {
                    result.add(file);
                }
            }
        }

        return result;
    }


    /**
     * 通用方法：根据自定义规则筛选文件
     * @param dirPath 目录路径
     * @param matcher 匹配规则接口
     * @return 符合规则的文件列表路径
     */
    private static ArrayList<String> findSimilarFilesPath(String dirPath, FileNameMatcher matcher) {
        ArrayList<String> result = new ArrayList<>();
        File dir = new File(dirPath);

        // 检查目录是否存在且是目录
        if (!dir.exists() || !dir.isDirectory()) {
            System.err.println("目录不存在或不是目录：" + dirPath);
            return result;
        }

        log.info("遍历文件所在目录: {}",dirPath);
        // 遍历目录下的所有文件（不包含子目录，如需递归可修改）
        File[] files = dir.listFiles();
        if (files == null) {
            return result; // 目录不可访问
        }
        log.info("目录中所包含的文件数量:{}",files.length);

        String filePrefix = "http://101.43.194.26:84/prod-api/profile/ppt/";

        for (File file : files) {
            if (file.isFile()) { // 只处理文件（排除目录）
                String fileName = file.getName();
                if (matcher.matches(fileName)) {
                    log.info("查找到匹配的文件名:{}",fileName);
                    result.add(filePrefix + file.getName());
                }
            }
        }

        return result;
    }

    /**
     * 文件名匹配规则接口
     */
    @FunctionalInterface
    private interface FileNameMatcher {
        boolean matches(String fileName);
    }

    // 测试
    private static void extracted() {
        String dirPath = "/Users/dsedu/Documents/doc/document"; // 目标目录

        // 1. 查找前缀为 "report_" 的文件
        List<File> prefixFiles = findByPrefix(dirPath, "report");
        System.out.println("前缀匹配（report_）的文件：");
        prefixFiles.forEach(file -> System.out.println(file.getName()));
        prefixFiles.forEach(file -> System.out.println(file.getAbsolutePath()));

        // 2. 查找后缀为 ".pdf" 的文件
        List<File> suffixFiles = findBySuffix(dirPath, ".pdf");
        System.out.println("\n后缀匹配（.pdf）的文件：");
        suffixFiles.forEach(file -> System.out.println(file.getName()));

        // 3. 查找包含 "2023" 的文件
        List<File> keywordFiles = findByKeyword(dirPath, "2023");
        System.out.println("\n包含关键字（2023）的文件：");
        keywordFiles.forEach(file -> System.out.println(file.getName()));

        // 4. 查找符合正则 "image_\d+\.png" 的文件（如 image_1.png、image_2.png）
        List<File> regexFiles = findByRegex(dirPath, "image_\\d+\\.png");
        System.out.println("\n正则匹配（image_数字.png）的文件：");
        regexFiles.forEach(file -> System.out.println(file.getName()));
    }
}
